package com.vv.tools.modules.sys.service.impl;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.vv.tools.common.constant.base.Constant;
import com.vv.tools.common.constant.sys.MenuTypeEnum;
import com.vv.tools.modules.sys.converter.MenuConvert;
import com.vv.tools.modules.sys.dao.MenuMapper;
import com.vv.tools.modules.sys.entity.Menu;
import com.vv.tools.modules.sys.model.MenuDTO;
import com.vv.tools.modules.sys.service.MenuService;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

/**
 * <p>
 * 菜单 服务实现类
 * </p>
 *
 * @author vv
 * @since 2025-02-19
 */
@Service
public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements MenuService {

    @Override
    public Set<String> getPermission(Long userId) {
        List<Menu> list;
        // 超级管理员
        if (userId.equals(Constant.SUPER_ADMIN)) {
            list = baseMapper.selectList(Wrappers.lambdaQuery(Menu.class)
                .eq(Menu::getType, MenuTypeEnum.BUTTON.getCode()));
        } else {
            list = baseMapper.queryMenu(userId);
        }
        return list.stream().map(Menu::getPermission).filter(StringUtils::isNotBlank).collect(Collectors.toSet());
    }

    @Override
    public List<MenuDTO> getAllMenus() {
        List<Menu> menus = baseMapper.selectList(Wrappers.lambdaQuery(Menu.class)
            .eq(Menu::getType, MenuTypeEnum.MENU.getCode()));

        return fillMenu(menus, 0L);
    }

    private List<MenuDTO> fillMenu(List<Menu> menus, Long parentId) {
        List<MenuDTO> list = new ArrayList<>();
        for (Menu menu : menus) {
            if (menu.getParentId().equals(parentId)) {
                MenuDTO menuDTO = MenuConvert.INSTANCE.do2dto(menu);
                menuDTO.setChildren(fillMenu(menus, menuDTO.getId()));
                list.add(menuDTO);
            }
        }
        return list;
    }

}
